<?php

class OrderController extends Zend_Controller_Action
{
	private $db;
	private $user;
	private $user_table;

	public function init()
	{
		Zend_Session::start();
		$session = new Zend_Session_Namespace('account');
		if(!isset($session->user) || $session->user->get("id") < 1)
		{
			header("Location: /account/login");
			return;
		}

		$db_obj = new myDb();
		$this->db = $db_obj->getDb();
		Zend_Db_Table::setDefaultAdapter($this->db);
	}

	public function makeOrderAction()
	{
		/* insert order  */
		$order = new Application_Model_Orders($_REQUEST);
		$mapper = new Application_Model_OrdersMapper();
		$order_no = $mapper->save($order);

		/* call alipay to pay */

		/* *
		 * 功能：即时到帐接口接入页
		 * 版本：3.2
		 * 修改日期：2011-03-25
		 * 说明：
		 * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
		 * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。

		 *************************注意*************************
		 * 如果您在接口集成过程中遇到问题，可以按照下面的途径来解决
		 * 1、商户服务中心（https://b.alipay.com/support/helperApply.htm?action=consultationApply），提交申请集成协助，我们会有专业的技术工程师主动联系您协助解决
		 * 2、商户帮助中心（http://help.alipay.com/support/232511-16307/0-16307.htm?sh=Y&info_type=9）
		 * 3、支付宝论坛（http://club.alipay.com/read-htm-tid-8681712.html）
		 * 如果不想使用扩展功能请把扩展功能参数赋空值。
		 */

		require_once(SITE_ROOT."/static/html/alipay/alipay.config.php");
		require_once(SITE_ROOT."/static/html/alipay/lib/alipay_service.class.php");

		/**************************请求参数**************************/

		//必填参数//

		//请与贵网站订单系统中的唯一订单号匹配
		$out_trade_no = $order_no; // date('Ymdhis');
		//订单名称，显示在支付宝收银台里的“商品名称”里，显示在支付宝的交易管理的“商品名称”的列表里。
		$subject      = "我爱进步网充值卡";//$_POST['subject'];
		//订单描述、订单详细、订单备注，显示在支付宝收银台里的“商品描述”里
		$body         = $_POST['amount']."元充值卡，收看视频课程"; //$_POST['body'];
		//订单总金额，显示在支付宝收银台里的“应付总额”里
		$total_fee    = $_POST['amount'];



		//扩展功能参数——默认支付方式//

		//默认支付方式，取值见“即时到帐接口”技术文档中的请求参数列表
		$paymethod    = '';
		//默认网银代号，代号列表见“即时到帐接口”技术文档“附录”→“银行列表”
		$defaultbank  = '';


		//扩展功能参数——防钓鱼//

		//防钓鱼时间戳
		$anti_phishing_key  = '';
		//获取客户端的IP地址，建议：编写获取客户端IP地址的程序
		$exter_invoke_ip = '';
		//注意：
		//1.请慎重选择是否开启防钓鱼功能
		//2.exter_invoke_ip、anti_phishing_key一旦被使用过，那么它们就会成为必填参数
		//3.开启防钓鱼功能后，服务器、本机电脑必须支持SSL，请配置好该环境。
		//示例：
		//$exter_invoke_ip = '202.1.1.1';
		//$ali_service_timestamp = new AlipayService($aliapy_config);
		//$anti_phishing_key = $ali_service_timestamp->query_timestamp();//获取防钓鱼时间戳函数


		//扩展功能参数——其他//

		//商品展示地址，要用 http://格式的完整路径，不允许加?id=123这类自定义参数
		$show_url			= '';
		//自定义参数，可存放任何内容（除=、&等特殊字符外），不会显示在页面上
		$extra_common_param = '';

		//扩展功能参数——分润(若要使用，请按照注释要求的格式赋值)
		$royalty_type		= "";			//提成类型，该值为固定值：10，不需要修改
		$royalty_parameters	= "";
		//注意：
		//提成信息集，与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条
		//各分润金额的总和须小于等于total_fee
		//提成信息集格式为：收款方Email_1^金额1^备注1|收款方Email_2^金额2^备注2
		//示例：
		//royalty_type 		= "10"
		//royalty_parameters= "111@126.com^0.01^分润备注一|222@126.com^0.01^分润备注二"

		/************************************************************/

		//构造要请求的参数数组
		$parameter = array(
				"service"			=> "create_direct_pay_by_user",
				"payment_type"		=> "1",

				"partner"			=> trim($aliapy_config['partner']),
				"_input_charset"	=> trim(strtolower($aliapy_config['input_charset'])),
				"seller_email"		=> trim($aliapy_config['seller_email']),
				"return_url"		=> trim($aliapy_config['return_url']),
				"notify_url"		=> trim($aliapy_config['notify_url']),

				"out_trade_no"		=> $out_trade_no,
				"subject"			=> $subject,
				"body"				=> $body,
				"total_fee"			=> $total_fee,

				"paymethod"			=> $paymethod,
				"defaultbank"		=> $defaultbank,

				"anti_phishing_key"	=> $anti_phishing_key,
				"exter_invoke_ip"	=> $exter_invoke_ip,


				"show_url"			=> $show_url,
				"extra_common_param"=> $extra_common_param,

				"royalty_type"		=> $royalty_type,
				"royalty_parameters"=> $royalty_parameters
					);

		//构造即时到帐接口
		$alipayService = new AlipayService($aliapy_config);
		$html_text = $alipayService->create_direct_pay_by_user($parameter);
		/* echo $html_text; */
		//===========================================
		$this->view->out_trade_no = $out_trade_no;
		$this->view->total_fee = $total_fee;
		$this->view->html_text = $html_text;

	}
	public function notifyAction()
	{

		/* *
		 * 功能：支付宝服务器异步通知页面
		 * 版本：3.2
		 * 日期：2011-03-25
		 * 说明：
		 * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
		 * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。


		 *************************页面功能说明*************************
		 * 创建该页面文件时，请留心该页面文件中无任何HTML代码及空格。
		 * 该页面不能在本机电脑测试，请到服务器上做测试。请确保外部可以访问该页面。
		 * 该页面调试工具请使用写文本函数logResult，该函数已被默认关闭，见alipay_notify_class.php中的函数verifyNotify
		 * 如果没有收到该页面返回的 success 信息，支付宝会在24小时内按一定的时间策略重发通知

		 * TRADE_FINISHED(表示交易已经成功结束，为普通即时到帐的交易状态成功标识);
		 * TRADE_SUCCESS(表示交易已经成功结束，为高级即时到帐的交易状态成功标识);
		 */


		require_once(SITE_ROOT."/static/html/alipay/alipay.config.php");
		require_once(SITE_ROOT."/static/html/alipay/lib/alipay_notify.class.php");

		//计算得出通知验证结果
		$alipayNotify = new AlipayNotify($aliapy_config);
		$verify_result = $alipayNotify->verifyNotify();
		logResult("notify, ");

		if($verify_result) {//验证成功
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代

			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			//获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
			/* $out_trade_no	= $_POST['out_trade_no'];	    //获取订单号 */
			/* $trade_no		= $_POST['trade_no'];	    	//获取支付宝交易号 */
			/* $total_fee	= $_POST['total_fee'];			//获取总价格 */

			if($_REQUEST['trade_status'] == 'TRADE_FINISHED' ||$_REQUEST['trade_status'] == 'TRADE_SUCCESS') {    //交易成功结束
				//判断该笔订单是否在商户网站中已经做过处理（可参考“集成教程”中“3.4返回数据处理”）
				//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
				//如果有做过处理，不执行商户的业务程序
				logResult("trade finished");

				$order_no   = $_GET['out_trade_no'];   
				$total_fee = $_GET['total_fee']; 
				$order = new Application_Model_Orders();
				$mapper = new Application_Model_OrdersMapper();
				$mapper->find($order_no, $order);

				if (!($order->get('id') > 0))
				{
					die("fail");
					logResult("notify, not found the order, fail");
				}
				else if ($order->get('amount') != $total_fee)
				{
					die("fail");
					logResult("notify, amount not match, fail");
				}
				else if ($order->get('status') == 1)
				{
					echo "success";
					logResult("notify, status = 1, already handled");
				}
				else if ($order->get('status') != 1)
				{
					$order->set('status', 1);
					if ($mapper->save($order))
					{	
					  /* get user info */
					  $user = new Application_Model_User();
					  $usermapper = new Application_Model_UserMapper();
					  $usermapper->find($order->get("uid"), $user);
					  
					  $user->set("wealth", $user->get("wealth") + $total_fee);
					  $usermapper->save($user);
					  
					  logResult("notify, set wealth += total_fee");
					 
					}
					else
					{
						$this->view->res = false;
						$this->view->msg = "数据库故障，请联系管理员处理。";
						logResult("notify, database failed");
					}
					echo "success";		//请不要修改或删除
					logResult("notify, update status to 1, echo success");
				}
				//调试用，写文本函数记录程序运行情况是否正常
			}
			else {
				echo "success";		//其他状态判断。普通即时到帐中，其他状态不用判断，直接打印success。
				logResult("notify, other status, success");

				//调试用，写文本函数记录程序运行情况是否正常
				//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
			}

			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		}
		else {
			//验证失败
			echo "fail";
			logResult("notify, verify failed");

			//调试用，写文本函数记录程序运行情况是否正常
			//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
		}
	}
	public function returnAction()
	{
		/* * 
		 * 功能：支付宝页面跳转同步通知页面
		 * 版本：3.2
		 * 日期：2011-03-25
		 * 说明：
		 * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
		 * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。

		 *************************页面功能说明*************************
		 * 该页面可在本机电脑测试
		 * 可放入HTML等美化页面的代码、商户业务逻辑程序代码
		 * 该页面可以使用PHP开发工具调试，也可以使用写文本函数logResult，该函数已被默认关闭，见alipay_notify_class.php中的函数verifyReturn

		 * TRADE_FINISHED(表示交易已经成功结束，为普通即时到帐的交易状态成功标识);
		 * TRADE_SUCCESS(表示交易已经成功结束，为高级即时到帐的交易状态成功标识);
		 */


		require_once("static/html/alipay/alipay.config.php");
		require_once("static/html/alipay/lib/alipay_notify.class.php");

		//计算得出通知验证结果
		$alipayNotify = new AlipayNotify($aliapy_config);
		$verify_result = $alipayNotify->verifyReturn();
		if($verify_result) {//验证成功
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代码

			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
			$order_no	= $_GET['out_trade_no'];	//获取订单号
			$alipay_trade_no= $_GET['trade_no'];		//获取支付宝交易号
			$total_fee	= $_GET['total_fee'];		//获取总价格
			$buyer_email    = $_GET['buyer_email']; /* 付款支付宝账号 */

			if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
				//判断该笔订单是否在商户网站中已经做过处理（可参考“集成教程”中“3.4返回数据处理”）
				//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
				//如果有做过处理，不执行商户的业务程序

				$order = new Application_Model_Orders();
				$mapper = new Application_Model_OrdersMapper();
				$mapper->find($order_no, $order);
				/* print_r($order->getOptions());  */
				if (!($order->get('id') > 0))
				{
					$this->view->res = false;
					$this->view->msg = "没有找到该订单";
					logResult("return, not found the order");
				}
				else if ($order->get('amount') != $total_fee)
				{
					$this->view->res = false;
					$this->view->msg = "充值金额不匹配";
					logResult("return, amount not match, fail");
				}
				else if ($order->get('status') == 1)
				{
					$this->view->res = false;
					$this->view->msg = "该订单已成功处理，请勿重复提交。";
					logResult("return, order is already handled");
				}
				else if ($order->get('status') != 1)
				{
					$order->set('status', 1);
					$order->set('alipay_trade_no', $alipay_trade_no);
					$order->set('buyer_email', $buyer_email);
					if ($mapper->save($order))
					{	
					  Zend_Session::start();
					  $session = new Zend_Session_Namespace('account');
					  $usermapper = new Application_Model_UserMapper();
					  /* print "==================================================<br/>order detail: <pre>"; */
					  /* print_r($order->getOptions()); */
					  /* print "</pre><br/>"; */
					  /* print "==================================================<br/>session detail: <pre>"; */
					  /* print_r($session->user->getOptions()); */
					  /* print "</pre><br/>"; */

					  if ($order->get("uid") == $session->user->get("id"))
					    {
					      $session->user->set("wealth", $session->user->get("wealth") + $total_fee);
					      $usermapper->save($session->user);

					      $this->view->res = true;
					      $this->view->msg = "您充值成功。充值金额：{$total_fee}元。";
					      logResult("return, order->uid == session->user->uid, set wealth += total_fee");
					    }
					  else
					    {
					      /* get user info */
					      $user = new Application_Model_User();
					      $usermapper->find($order->get("uid"), $user);
					      
					      $user->set("wealth", $user->get("wealth") + $total_fee);
					      $usermapper->save($user);

					      logResult("return, order->uid != session->user->uid, set wealth += total_fee");
					    }
					  
					  logResult("return, handling the order");
					}
					else
					{
						$this->view->res = false;
						$this->view->msg = "数据库故障，请联系管理员处理。";
						logResult("return, database failed");
					}
				}
			}
			else {
				$this->view->res = false;
				$this->view->msg = "付款状态不正确{$_GET['trade_status']}，请联系客服处理。";
				logResult("return, pay status not correct");
				/* echo "trade_status=".$_GET['trade_status']; */
			}

			/* echo "验证成功<br />"; */
			/* echo "trade_no=".$trade_no; */

			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		}
		else {
			//验证失败
			//如要调试，请看alipay_notify.php页面的verifyReturn函数，比对sign和mysign的值是否相等，或者检查$responseTxt有没有返回true
			$this->view->res = false;
			$this->view->msg = "验证失败，非法数据。";
			logResult("return, verify failed");
		}
	}
	public function insertOrderAction()
	{

	}
};


